/* ***** BEGIN LICENSE BLOCK *****
 *
 * The contents of this file are subject to the Mozilla Public License Version 1.1
 * (the "License"); you may not use this file except in compliance with the
 * License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
 * the specific language governing rights and limitations under the License.
 * 
 * The Original Code is CnCNet Server code, Released 30th December 2009.
 * 
 * The Initial Developers of the Original Code are
 * Adam Krock and John Sanderson. Portions created by
 * the Initial Developer are Copyright (C) 2009
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s): Adam Krock, John Sanderson.
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either of the GNU General Public License Version 2 or later (the "GPL"),
 * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 * 
 * ***** END LICENSE BLOCK *****/

using System;

namespace cncNetServerV2
{
	// The basic unit (per connection)
	public class client
	{	
		// Networking specific info
		public System.Net.Sockets.Socket mySocket;
		public System.Net.IPEndPoint myEndPoint;
		public System.Net.IPAddress myIPAddress;
					
		// User Version info
		public string myVersion; //md5
				
		// User login Info
		public string myName;
		public string myPassword;
			
		// User submitted info	
		public string myGame;
		public string myComputerId; // md5 of mac address
			
		// Generated ID info
		public string mySessionId; //md5
		
		
		public client(System.Net.Sockets.Socket s)
		{
			// Set networking info from handler socket
			mySocket = s;
			myEndPoint = (System.Net.IPEndPoint)s.RemoteEndPoint;
			myIPAddress = ((System.Net.IPEndPoint)s.RemoteEndPoint).Address;

		}
		
		// Set the clients version info
		public bool setVersionInfo(byte[] b)
		{
			codec.packets.clientVersion tempOne = 
				new codec.packets.clientVersion(b);
			if(tempOne.myId.Equals(1))
			{
				myVersion = tempOne.myVersion.myString;
				return true;
			}
			return false;
		}
		
		// Set the client's login Info
		public bool setLoginInfo(byte[] b)
		{
			codec.packets.clientLogin tempOne = 
				new codec.packets.clientLogin(b);
			if(tempOne.myId.Equals(3))
			{
				myName = tempOne.myUserName.myString;
				myPassword = tempOne.myPassword.myString;
				return true;
			}
			return false;
		}
		
		// Set the client's user info
		public bool setUserInfo(byte[] b)
		{
			codec.packets.clientUserInfo tempOne =
				new codec.packets.clientUserInfo(b);
			if(tempOne.myId.Equals(5))
			{
				myGame = tempOne.myGame.myString;
				myComputerId = tempOne.myComputerId.myString;
				return true;
			}
			return false;
		}
			
		// End the user's session
		// Can be used to kick
		public void endSession()
		{
			mySocket.Close();
		}
		
		// Ban the user from the server
		public void banSession()
		{
			// Perform Ban here
			// Add computerId to the ban list 
		}
			
		// Send a message to the client
		public void sendMessage(string s)
		{
			// Encode the message into a packet
			codec.packets.clientSendMessage tempOne = 
				new codec.packets.clientSendMessage(mySessionId, s);
			
			// Send the message to the client using the connected socket
			mySocket.Send(tempOne.getBytes());	
		}
	}
}